home *** CD-ROM | disk | FTP | other *** search
- #include "3DDEF.H"
- #include "GLOBAL.H"
- #include "FORWARD.H"
- #include "XCODE.H"
-
- static UBYTE l[VERY_LONG_LINE], s[VERY_LONG_LINE], w[VERY_LONG_LINE]; /* 十分なエリア */
-
- /* フラグ=1で、最初に情報を付けてセーブする */
- /* h から last の前の行までをセーブする */
- /* fn が NULL ならば、カレントの名前で、さもなくば fn の名前でセーブする */
- int
- buff_save_file(int flag,UNIT *h,UNIT *last,STR fn)
- {
- register UNIT *wp;
- register UBYTE *p,*q;
- register UBYTE c;
- register FILE *fp;
- int writeline = 0;
- UBYTE s[VERY_LONG_LINE * 4];
- UBYTE d[VERY_LONG_LINE * 4];
- UBYTE fname[MAXLINE];
- UBYTE tname[MAXLINE];
- FILE *fpb;
-
- if (fn) { /* 指定があるなら */
- strcpy(fname,fn); /* それ */
- } else { /* さもなくば */
- strcpy(fname,FILE_NAMES[WDATA[CWN].WTEXTS].CONTENT); /* カレントの名前を得る */
- }
- etc_get_tname(tname,fname);
- if (!*tname) {
- return(0);
- }
-
- under_print((STR)"[書き出し中...]");
- if (!(fp = fopen((char *)tname,"wb"))) {
- error("ファイルの書き込みオープンが出来ません");
- return(0);
- }
-
- if (flag) {
- fprintf(fp,"[This is a ThunderWord Text]\x0d\x0a");
- fprintf(fp,"[WIDTH=%d]\x0d\x0a",CURRENT_JIZUME);
- fprintf(fp,"[LWIDTH=%d]\x0d\x0a",(!!LYW_UPPER)+(!!LYW_UNDER)*2);
- fprintf(fp,"[PAGE=%d]\x0d\x0a",PAGE);
- fprintf(fp,"[CR=%d]\x0d\x0a",CR_VIEW); /* 改行を表示するか */
- fprintf(fp,"[TAB=%d,%d]\x0d\x0a",TAB_LENGTH,TAB_VIEW); /* タブの長さと、表示 */
- if (sysflag & 0b1) {
- fprintf(fp,"[HGAP=%d]\x0d\x0a",PRN_H_PITCH); /* 横ギャップ */
- fprintf(fp,"[VGAP=%d]\x0d\x0a",PRN_V_PITCH); /* 縦ギャップ */
- fprintf(fp,"[LEFT_MARGIN=%d]\x0d\x0a",PRN_LEFT_MARGIN); /* 左マージン */
- fprintf(fp,"[UP_MARGIN=%d]\x0d\x0a",PRN_UP_MARGIN); /* 上マージン */
- }
- #if 0
- fprintf(fp,"[BAK=%d]\x0d\x0a",CURRENT_BAK); /* ~.BAK を作るのか? */
- fprintf(fp,"[MODE=%s]\x0d\x0a",(CMDMOD)?"ED":"ME"); /* モード */
- #endif
- fprintf(fp,"[ThunderWord Control End]\x0d\x0a");
- }
- if (h) {
- wp = h;
- } else {
- wp = HEAD->ATO; /* 最初の一行 */
- }
-
- if (!last) {
- last = TAIL;
- }
-
- while(wp != last) {
- p = s;
- line_get_body(s,wp); /* s がバッファの実体 */
- q = d; /* d が掃除後のバッファの実体 */
- while(c = *p++) {
- if (c == XCODE_UP) {
- register UBYTE c0;
-
- c0 = *p++; /* 次の1バイト */
-
- switch(c0) {
- case XCODE_MARK+0:
- case XCODE_MARK+1:
- case XCODE_MARK+2:
- case XCODE_MARK+3:
- case XCODE_MARK+4:
- case XCODE_MARK+5:
- case XCODE_MARK+6:
- case XCODE_MARK+7:
- case XCODE_MARK+8:
- case XCODE_MARK+9: /* マーク 0x20 - 0x29 */
- case XCODE_MARK+10:
- case XCODE_MARK+11:
- case XCODE_MARK+12:
- case XCODE_MARK+13:
- case XCODE_MARK+14:
- case XCODE_MARK+15:
-
- case XCODE_SYSMARK+0: /* システムマーク */
- case XCODE_SYSMARK+1:
- case XCODE_SYSMARK+2:
- case XCODE_SYSMARK+3:
- case XCODE_SYSMARK+4:
- case XCODE_SYSMARK+5:
- case XCODE_SYSMARK+6:
- case XCODE_SYSMARK+7:
- case XCODE_SYSMARK+8:
- case XCODE_SYSMARK+9:
- case XCODE_SYSMARK+10:
- case XCODE_SYSMARK+11:
- case XCODE_SYSMARK+12:
- case XCODE_SYSMARK+13:
- case XCODE_SYSMARK+14:
- case XCODE_SYSMARK+15:
- break; /* マークは捨てる */
-
- case XCODE_UL: /* 下線 */
- *q++ = c;
- *q++ = c0;
- break; /* 下線は書き込む */
-
- case XCODE_RB10: /* 予約:1文字真ん中ルビ */
- case XCODE_RB1: /* 1文字ルビ */
- case XCODE_RB1L: /* 1文字ルビ左(全角用) */
- case XCODE_RB1R: /* 1文字ルビ右(全角用) */
- *q++ = c;
- *q++ = c0;
- *q++ = *p++;
- *q++ = *p++;
- break; /* ルビであるから、2バイト文字 */
- case XCODE_RB2: /* 2文字ルビ(全角用) */
- *q++ = c;
- *q++ = c0;
- *q++ = *p++;
- *q++ = *p++;
- *q++ = *p++;
- *q++ = *p++;
- break; /* ルビであるから、2バイト文字 */
- }
- } else {
- *q++ = c;
- }
- }
- if ((q != d) && (q[-1] == CR)) {
- q[-1] = (UBYTE) '\x0d';
- *q++ = (UBYTE) '\x0a';
- }
- *q = EOS;
- writeline++;
- if (fputs((char *)d,fp)) {
- error("ファイル書き込みに失敗しました");
- return(0);
- }
- wp = wp->ATO;
- }
- if (fflush(fp)) {
- error("ファイル書き込みに失敗しました");
- return(0);
- }
- fclose(fp);
-
- if (CURRENT_BAK) { /* ~.BAK を作るのか? */
- UBYTE backname[MAXLINE];
-
- etc_get_pathname_bak(backname,fname); /* 名前を得る */
- if (fpb = fopen((char *)backname,"rb")) { /* 存在するか */
- fclose(fpb); /* クローズする */
- if (fdelete(backname)) { /* バックアップファイルを削除する */
- /* 削除できない! エラーは無視 */
- if (fdelete(fname)) { /* オリジナルを削除する */
- /* 削除出来ない! 暫定名で終了 */
- UBYTE w[MAXLINE];
-
- sprintf((char *) w,
- "[ %s に %d 行をセーブしました]",tname,writeline);
- under_print(w);
- return(0);
- }
- } else { /* 削除出来た */
- if (frename(fname,backname)) { /* オリジナルを~.BAKに改名する */
- /* 改名出来ない! 暫定名で終了 */
- UBYTE w[MAXLINE];
-
- sprintf((char *) w,
- "[ %s に %d 行をセーブしました]",tname,writeline);
- under_print(w);
- return(0);
- } else { /* 暫定ファイルをリネームする */
- if (frename(tname,fname)) {
- error("ファイルの名前変更に失敗しました");
- return(0);
- }
- }
- }
- } else {
- /* ~.BAKは最初から存在しなかった */
- if (fpb = fopen((char *)fname,"rb")) { /* オリジナルが存在するか */
- fclose(fpb); /* クローズする */
- if (frename(fname,backname)) { /* オリジナルを~.BAKに改名する */
- /* 改名できない! */
- UBYTE w[MAXLINE];
-
- sprintf((char *) w,
- "[ %s に %d 行をセーブしました]",tname,writeline);
- under_print(w);
- return(0);
- }
- }
- if (frename(tname,fname)) {
- error("ファイルの名前変更に失敗しました");
- return(0);
- }
- }
-
- } else { /* BAK 作らないモード */
- if (fpb = fopen((char *)fname,"rb")) { /* オリジナルが存在するか */
- fclose(fpb); /* クローズする */
- if (fdelete(fname)) {
- /* 削除出来ない! */
- UBYTE w[MAXLINE];
-
- sprintf((char *) w,"[ %s に %d 行をセーブしました]",tname,writeline);
- under_print(w);
- return(0);
- } else { /* 削除出来た */
- if (frename(tname,fname)) {
- error("ファイルの名前変更に失敗しました");
- return(0);
- }
- }
- } else {
- if (frename(tname,fname)) {
- error("ファイルの名前変更に失敗しました");
- return(0);
- }
- }
- }
-
- {
- UBYTE w[MAXLINE];
- sprintf((char *) w,"[ %d 行]",writeline);
- under_print(w);
- }
- return(1);
- }
-
- void
- buff_read_file_x(int tn)
- {
- UBYTE s[MAXLINE];
-
- if (tn == CURRENT_TEXT) {
- buff_read_file();
- } else {
- FILE *fp;
- UBYTE s[MAXLINE];
-
- *s = EOS; /* 前からの繰り越しはなし */
- fp = FILE_POINTERS[tn];
- if (!fp) { /* 実物がない */
- buff_read_file_new_x(tn);
- } else { /* 実物がある */
- /* init_skip_cnf(fp,s);*/
- init_by_cnf_or_default_tn(fp,s,tn);
- buff_read_file_ins(fp,s,&TDATA[tn].TEXT_TAILS);
- }
- }
- }
-
- /* テキストの初期化だけする */
- UNIT *
- buff_read_file_new_x(int tn)
- {
- UNIT *p;
-
- p = line_get_free_and_store((STR)"");
- if (p == NIL) { /* フリーラインが無い! */
- under_print0((STR)"メモリ不足:途中で中断します。他の文章をすぐ保存して下さい [Y]? ");
- etc_wait_y();
- return(&AXE);
- /* etc_om_exit();*/
- } else {
- line_insert1_mae(p,&TDATA[tn].TEXT_TAILS);
- }
- return(p);
- }
-
- /* テキストの初期化だけする */
- int
- buff_read_file_new()
- {
- CL = buff_read_file_new_x(CURRENT_TEXT);
- under_print((STR)"[ 新規ファイル ]");
- disp_btm_line(CWN);
- meta_left_blaket();
- return(0);
- }
-
- /* ファイルの読み込み */
- /* カレントバッファ(空)にカレントファイルを読み込む */
- /* error = -1 */
- int
- buff_read_file()
- {
- FILE *fp;
-
- CL = NIL;
- *s = EOS; /* 前からの繰り越しはなし */
- fp = FILE_POINTERS[CURRENT_TEXT];
- if (!fp) {
- buff_read_file_new();
- init_get_default_tn(CURRENT_TEXT);
- return(0);
- }
- init_by_cnf_or_default_tn(fp,s,CURRENT_TEXT);
- under_print0((STR)"[ファイル読み込み中…]"); /* 時間の掛かる作業の時はメッセージを出す */
-
- buff_read_file_ins(fp,s,TAIL);
- fclose(fp);
- under_blanc();
- disp_btm_line(CWN);
- meta_left_blaket();
- return(0);
- }
-
- /* 先頭に s を付けてカレントテキストに挿入する */
- /* 生成した行数を返す */
- /* 挿入後、最後に改行が無く、しかも TAIL の前でなければ改行を付け加える */
- int
- buff_read_file_ins(FILE *fp,STR s,UNIT *cl)
- {
- register int lc=0;
- register UINT jizume,jizume4;
- register UINT jizume3;
- UINT slen;
- UNIT *p,*cl0;
-
- cl0 = cl->MAE;
- jizume = CURRENT_JIZUME;
- /* jizume3 = jizume+3;*/
- jizume4 = jizume+4;
- do {
- if (!*s) {
- fgets((char *)s,jizume4,fp); /* s がヌルなら適当な長さだけ読み出す */
- }
-
- while(1) {
- if (((slen = strlen(s)) >= 2) &&
- (s[slen-1] == CR) && (s[slen-2] == '\x0d')) {
- s[slen-2] = CR;
- s[slen-1] = EOS;
- break;
- }
- if (string_disp_len(s) > (jizume+6)) { /* 禁則はみだしがあるので長め */
- break;
- }
- fgets((char *)l,jizume4,fp); /* 適当な長さだけ読み出す */
- strcat(s,l); /* 前からの繰り越しの後に加える */
- if (feof(fp)) break;
- }
-
- if ((cl == CL) && ((CL != NIL) && (!*s))) { /* feof に達した */
- break;
- }
- cut_line(s,w,s,jizume);
- p = line_get_free_and_store(w);
- if (p == NIL) { /* フリーラインが無い! */
- etc_beep();
- under_print0((STR)"メモリ不足:途中で中断します。他の文章をすぐ保存して下さい [Y]? ");
- etc_wait_y();
- line_deleten(cl0,cl);
- etc_beep();
- under_print0((STR)"安全のため、読み込んだ文章を破棄しました [Y]? ");
- etc_wait_y();
- return(0);
- /* etc_om_exit();*/
- } else {
- if ((cl == CL) && (CL == NIL)) {
- CL = p; /* ポインタの初期化 */
- }
- line_insert1_mae(p,cl);
- lc++;
- }
- } while((!feof(fp)) || (*s));
- if ((etc_last(w) != CR) && (p->ATO != TAIL)) {
- strcat(w,"\n");
- line_store_and_echo(p,w);
- }
- etc_trim_tail();
- return(lc);/* ,,, */
- }
-
- int
- buff_ishan2byte(UBYTE c1)
- {
- return((c1 == (UBYTE)'\x80') || ((c1 >= (UBYTE)'\xf0') && (c1 < (UBYTE) XCODE_UP)));
- }
-
- /* カットバッファに文字列を送り込む */
- /* マークコードは取り除く */
- /* 文字列の中にマークコードがあったなら対応するビットを立てて返す */
- /* 32ビットだよーん */
- UINT
- buff_add_to_cut_buff(STR s)
- {
- UINT mask = 0;
- STR p0;
- register STR p;
-
- p0 = p = s;
- mask = mark_find_mark(s);
- if (mask) { /* マークを取り除かなければいけない */
- UBYTE w[VERY_LONG_LINE];
- register STR pw;
-
- p = s;
- pw = w;
- while(*p) {
- if ((*pw++ = *p++) == XCODE_UP) {
- if ((XCODE_MARK <= *p) && (*p <= (XCODE_MARKLAST))) {
- /* マークだ! */
- mask |= (1 << (*p - XCODE_MARK));
- pw--;
- p++;
- }
- }
- }
- *pw = EOS;
- p0 = w;
- }
- line_append_cut_buff_list(p0);
- return(mask);
- }
-
- /* カットバッファから文字列を取り出す */
- /* 指定されたユニット番号から、指定されたバイト数を渡す */
- /* l == 0 だと、最初の一行を無条件に渡す */
- /* 何ユニット目を渡したかを返す。-1なら何も渡せない */
- int
- buff_get_from_cut_buff(STR s,int l,int begin)
- {
- UNIT *wp,*wp0;
- UBYTE w[VERY_LONG_LINE];
- UINT len = 0;
- int i;
-
- *s = EOS;
- wp = CUT_BUFF_HEAD;
- for(i = 0;i < begin;i++) {
- if (wp == NIL) return(-1); /* 最初のユニットに達する前に終わった */
- wp = wp->ATO;
- }
-
- if (wp == NIL) return(-1); /* 最初のユニットに達する前に終わった */
- while(wp) {
- line_get_body(w,wp);
- strcat(s,w); /* 追加する */
- len += wp->LENGTH;
- if ((wp = wp->ATO) == NIL) {
- break;
- }
- if (len < l) { /* まだ足りない */
- i++;
- continue; /* 続行 */
- } else { /* ちょうどもしくは長い */
- break; /* 拡張コードなどの関係があるのでこうなってる */
- }
- }
- return(i);
- }
-
- UNIT *
- line_append_cut_buff_list(UBYTE *s)
- {
- UNIT *p;
-
- if (!(p = line_get_free_and_store(s))) return(NIL);
-
- if (CUT_BUFF_HEAD) { /* 袋リストがある */
- CUT_BUFF_TAIL->ATO = p; /* 最後の次が手持ちになる */
- p->MAE = CUT_BUFF_TAIL; /* 手持ちの前は最後 */
- p->ATO = NIL; /* 新しい最後は NIL を指す */
- CUT_BUFF_TAIL = p; /* 新しい最後を指す */
- } else { /* フリーラインがない */
- CUT_BUFF_HEAD = CUT_BUFF_TAIL = p;
- p->MAE = p->ATO = NIL;
- }
- return(p);
- }
-
- void
- buff_clear_cut_buff()
- {
- line_deleten_list(CUT_BUFF_HEAD,CUT_BUFF_TAIL);
- CUT_BUFF_HEAD = CUT_BUFF_TAIL = NIL;
- line_deleten_list(CUT_BUFF_HEAD0,CUT_BUFF_TAIL0);
- CUT_BUFF_HEAD0 = CUT_BUFF_TAIL0 = NIL;
- }
-